package Estats;

import java.util.ArrayList;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.Sound;
import org.newdawn.slick.gui.AbstractComponent;
import org.newdawn.slick.gui.ComponentListener;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;
import GUI.BotoMenu;
import factoryTotal.EstatJuego0;
import factoryTotal.EstatJuego1;
import factoryTotal.EstatJuego2;
import newMenu.ManagerRecursos;
import newMenu.ManagerPerfil;

/**
 * Estado que muestra uno de los possibles aviones , con sus caracteristicas, que el jugador podra utilizar
 * @author Xavier Pol Sevilla y Raul Delgado Astudillo
 */
public class EstatAvion1 extends BasicGameState {

    // Identificador del estado
    public static final int ID = 5;
    // Contenedor del juego
    private GameContainer container;
    // Contenedor de estados
    private StateBasedGame state;
    // Boton para seleccionar el avion que aparece en pantalla y empezar la partida
    private BotoMenu botoJugar;
    // Boton para ver el siguiente avion
    private BotoMenu botoAvioMes;
    // Boton para ver el avion anterior
    private BotoMenu botoAvioMenys;
    // Boton volver
    private BotoMenu botoVolver;
    // Boolean utilizado para comprovar cuando se ha de realizar la transparencia
    private boolean alphaBotonsIn;
    // Boolean utilizado para comprovar cuando se ha de realizar la transparencia
    private boolean alphaBotonsOut;
    // ArrayList con todos los botones del estado
    private ArrayList<BotoMenu> botones;
    // Contador para controlar el movimiento de los botones
    private int contador;
    // Indica a que estado se de cambiar
    private int cambioA;
    // Float para alpha bending
    private float trans;
    // Imatgen de fondo de pantalla
    private Image imatgeFons;
    // Imatgen de fondo de pantalla CAT
    private Image imatgeFonsCat;
    // Imatgen de fondo de pantalla ENG
    private Image imatgeFonsEng;
    // Imatge del boto normal (Sense mouse over)
    private Image imatgeBotoNormal;
    // Image del boto amb mouse over
    private Image imatgeBotoOver;
    // Imatge del text Jugar del boto
    private Image imatgeTextJugar;
    // Imatge del text Jugar del boto CAT
    private Image imatgeTextJugarCat;
    // Imatge del text Jugar del boto ENG
    private Image imatgeTextJugarEng;
    // Imatge del text Perfil del boto
    private Image imatgeTextAnterior;
    // Imatge del text dades
    private Image imatgeTextSiguiente;
    // Imatge del text Perfil del boto CAT
    private Image imatgeTextAnteriorCat;
    // Imatge del text dades CAT
    private Image imatgeTextSiguienteCat;
    // Imatge del text Perfil del boto ENG
    private Image imatgeTextAnteriorEng;
    // Imatge del text dades ENG
    private Image imatgeTextSiguienteEng;
    // Imatge del text Sortir del boto
    private Image imatgeTextVolver;
    // Imatge del text Sortir del boto CAT
    private Image imatgeTextVolverCat;
    // Imatge del text Sortir del boto ENG
    private Image imatgeTextVolverEng;
    // So del click que fan els botons al fer un mouse clicked
    private Sound soClick;
    // So del mouse que fan els botons pel mouse over
    private Sound soOver;
    //Idioma perfil
    private int idioma;

    /**
     * BasicGameState obliga a implementar este metodo, retorna el ID del estado
     * @return int 
     */
    public int getID() {
        return ID;
    }

    /**
     * Inicia todo lo necessario para el estado, solo se ejecuta una unica vez y al entrar en el estado
     * @param container
     * @param game
     * @throws SlickException
     */
    public void init(GameContainer container, StateBasedGame state) {
        this.container = container;
        this.state = state;
        // Se cargan todos los recursos que se utilizaran en este estado
        imatgeFons = ManagerRecursos.getImage("fondoAvion1EspImage");
        imatgeFonsCat = ManagerRecursos.getImage("fondoAvion1CatImage");
        imatgeFonsEng = ManagerRecursos.getImage("fondoAvion1EngImage");
        imatgeBotoOver = ManagerRecursos.getImage("botoPetitImage");
        imatgeBotoNormal = ManagerRecursos.getImage("botoPetitOverImage");
        imatgeTextJugar = ManagerRecursos.getImage("textJugarImage");
        imatgeTextAnterior = ManagerRecursos.getImage("textAnteriorImage");
        imatgeTextSiguiente = ManagerRecursos.getImage("textSeguentImage");
        imatgeTextJugarCat = ManagerRecursos.getImage("textJugarCatImage");
        imatgeTextAnteriorCat = ManagerRecursos.getImage("textAnteriorImage");
        imatgeTextSiguienteCat = ManagerRecursos.getImage("textSeguentCatImage");
        imatgeTextAnteriorEng = ManagerRecursos.getImage("textAnteriorEngImage");
        imatgeTextSiguienteEng = ManagerRecursos.getImage("textSeguentEngImage");
        imatgeTextJugarEng = ManagerRecursos.getImage("textJugarEngImage");
        imatgeTextVolver = ManagerRecursos.getImage("textTornarEspImage");
        imatgeTextVolverCat = ManagerRecursos.getImage("textTornarCatImage");
        imatgeTextVolverEng = ManagerRecursos.getImage("textTornarEngImage");
        soClick = ManagerRecursos.getSound("clickSound");
        soOver = ManagerRecursos.getSound("overSound");
    }

    /**
     * Reinicio de las variables utilizadas en este estado
     */
    private void reiniciarVariables() {
        botones = new ArrayList<BotoMenu>();
        cambioA = 0;
    }

    /**
     * Este metodo crea todos los botones que apareceran en el estado
     */
    private void crearBotonsMenuNormal() {
        // Boton Menu Empezar partida
        botoJugar = new BotoMenu(container, imatgeBotoNormal, container.getWidth() - 265, 540);
        botoJugar.setMouseOverImage(imatgeBotoOver);
        // Seleccionamos el texto que llevara el boton dependiendo del idioma del perfil
        if (idioma == 1) {
            botoJugar.setImageText(imatgeTextJugar);
        } else if (idioma == 2) {
            botoJugar.setImageText(imatgeTextJugarCat);
        } else if (idioma == 3) {
            botoJugar.setImageText(imatgeTextJugarEng);
        }
        botoJugar.setMouseDownSound(soClick);
        botoJugar.setMouseOverSound(soOver);
        botones.add(botoJugar);
        // Boton Menu mostrar siguiente avion
        botoAvioMes = new BotoMenu(container, imatgeBotoNormal, 500, 690);
        botoAvioMes.setMouseOverImage(imatgeBotoOver);
        // Seleccionamos el texto que llevara el boton dependiendo del idioma del perfil
        if (idioma == 1) {
            botoAvioMes.setImageText(imatgeTextSiguiente);
        } else if (idioma == 2) {
            botoAvioMes.setImageText(imatgeTextSiguienteCat);
        } else if (idioma == 3) {
            botoAvioMes.setImageText(imatgeTextSiguienteEng);
        }
        botoAvioMes.setMouseDownSound(soClick);
        botoAvioMes.setMouseOverSound(soOver);
        botones.add(botoAvioMes);
        // Boton Menu mostrar avion anterior
        botoAvioMenys = new BotoMenu(container, imatgeBotoNormal,  10, 690);
        botoAvioMenys.setMouseOverImage(imatgeBotoOver);
        // Seleccionamos el texto que llevara el boton dependiendo del idioma del perfil
        if (idioma == 1) {
            botoAvioMenys.setImageText(imatgeTextAnterior);
        } else if (idioma == 2) {
            botoAvioMenys.setImageText(imatgeTextAnteriorCat);
        } else if (idioma == 3) {
            botoAvioMenys.setImageText(imatgeTextAnteriorEng);
        }
        botoAvioMenys.setMouseDownSound(soClick);
        botoAvioMenys.setMouseOverSound(soOver);
        botones.add(botoAvioMenys);
        // Boton Menu volver al menu principal
        botoVolver = new BotoMenu(container, imatgeBotoNormal, container.getWidth() - 265, 600);
        botoVolver.setMouseOverImage(imatgeBotoOver);
        // Seleccionamos el texto que llevara el boton dependiendo del idioma del perfil
        if (idioma == 1) {
            botoVolver.setImageText(imatgeTextVolver);
        } else if (idioma == 2) {
            botoVolver.setImageText(imatgeTextVolverCat);
        } else if (idioma == 3) {
            botoVolver.setImageText(imatgeTextVolverEng);
        }
        botoVolver.setMouseDownSound(soClick);
        botoVolver.setMouseOverSound(soOver);
        botones.add(botoVolver);


    }

    /**
     * Añadimos la funcionalidad a los botones
     */
    private void afegirListeners() {
        botoJugar.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent comp) {
                if (!alphaBotonsIn && !alphaBotonsOut) {
                    alphaBotonsOut = true;
                    ManagerPerfil.setNave(1);
                    if (ManagerPerfil.getNivel() == 1) {
                        cambioA =  EstatJuego0.ID;
                    } else if (ManagerPerfil.getNivel() == 2) {
                        cambioA =  EstatJuego1.ID;
                    } else if (ManagerPerfil.getNivel() == 3) {
                        cambioA =  EstatJuego2.ID;
                    }
                }
            }
        });
        botoAvioMes.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent comp) {
                if (!alphaBotonsIn && !alphaBotonsOut) {
                    alphaBotonsOut = true;
                    cambioA = EstatAvion2.ID;
                }
            }
        });
        botoAvioMenys.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent comp) {
                if (!alphaBotonsIn && !alphaBotonsOut) {
                    alphaBotonsOut = true;
                    cambioA = EstatAvion3.ID;
                }
            }
        });
        botoVolver.addListener(new ComponentListener() {

            public void componentActivated(AbstractComponent comp) {
                if (!alphaBotonsIn && !alphaBotonsOut) {
                    alphaBotonsOut = true;
                    cambioA = EstatMenuPrincipal.ID;
                }
            }
        });
    }

    /**
     * El framework se encarga de llamar a este metodo para que vaya actualizando las varibales
     * dentro del estado(cada x frames por segundo).
     * @param container
     * @param game
     * @param delta
     * @throws SlickException
     */
    public void update(GameContainer game, StateBasedGame state, int delta) {
        //Si estamos en un momento de transicion entre estados se realiza un efecto de transparencia
        if (alphaBotonsIn) {
            contador += 50;
            if (contador % 100 == 0) {
                // Cantidad de transparencia de los botones
                trans += 0.05;
            }
            if (trans >= 1) {
                // Cuando la transparencia de los botones es ninguna se activan sus funcionalidades
                botoJugar.setActiu(true);
                botoAvioMes.setActiu(true);
                botoAvioMenys.setActiu(true);
                botoVolver.setActiu(true);
                alphaBotonsIn = false;
                contador = 0;
            }
        } else if (alphaBotonsOut) {
            // Si los botones se vuelven transparentes se desactivan sus funcionalidades
            botoJugar.setActiu(false);
            botoAvioMes.setActiu(false);
            botoAvioMenys.setActiu(false);
            botoVolver.setActiu(false);
            contador += 50;
            if (contador % 100 == 0) {
                trans -= 0.05;
            }
            // Cuando la transparencia es total se procede a cambiar de estado
            if (trans <= 0) {
                state.enterState(cambioA);
            }
        }
    }

    /**
     * Metodo que renderiza los elementos que aparecen por pantalla
     * @param container
     * @param game
     * @param
     * @throws SlickException
     */
    public void render(GameContainer game, StateBasedGame state, Graphics g) {
        // Escogemos un fondo dependiendo del idioma del perfil
        if (idioma == 1) {
            imatgeFons.draw(0,0);
        } else if (idioma == 2) {
            imatgeFonsCat.draw(0,0);
        } else if (idioma == 3) {
            imatgeFonsEng.draw(0,0);
        }
        imatgeBotoNormal.setAlpha(trans);
        imatgeBotoOver.setAlpha(trans);
        imatgeTextJugar.setAlpha(trans);
        imatgeTextSiguiente.setAlpha(trans);
        imatgeTextAnterior.setAlpha(trans);
        imatgeTextVolver.setAlpha(trans);
        botoJugar.render(container, g);
        botoAvioMes.render(container, g);
        botoAvioMenys.render(container, g);
        botoVolver.render(container, g);
    }

    /**
     * Metodo que se ejecuta una vez se ha entrado en el estado, solo se ejcuta una vez
     * @param gc : context on es situa l'estat actual
     * @param state : estat actual
     */
    @Override
    public void enter(GameContainer gc, StateBasedGame state) {
        //Recuperamos idioma sleccionado
        idioma = ManagerPerfil.getIdioma();
        reiniciarVariables();
        crearBotonsMenuNormal();
        afegirListeners();
        alphaBotonsIn = true;
    }

    /**
     * Metodo que se ejecuta al salir del estado, solo se ejecuta una vez
     * @param gc
     * @param state
     */
    @Override
    public void leave(GameContainer gc, StateBasedGame state) {
        alphaBotonsOut = false;
        imatgeBotoNormal.setAlpha(1f);
        imatgeBotoOver.setAlpha(1f);
        imatgeTextJugar.setAlpha(1f);
        imatgeTextSiguiente.setAlpha(1f);
        imatgeTextAnterior.setAlpha(1f);
        imatgeTextVolver.setAlpha(1f);
        contador = 0;
    }
}
